package com.dingding.common.core.amap;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.apache.log4j.Logger;

import com.alibaba.fastjson.JSONObject;
import com.dingding.common.core.util.JSONUtil;

/**
 * 
 * @ClassName: AmapUtil 
 * @Description: 高德地图调用工具类
 * @author CHEHAUNBO 
 * @date 2016年1月12日 下午3:48:21
 * @version V1.8
 * @since V1.8(当前类出现的版本)
 * 
 */
public class AmapHttpClientUtil extends AmapConfig {

	private static final Logger log = Logger.getLogger(AmapHttpClientUtil.class);

	private static HttpClient httpClient = null;
	private static HttpPost httpPost = null;

	static {
		httpClient = HttpClients.custom().build();
		httpPost = new HttpPost(AmapConfig.URL);
	}

	/**
	 * 
	 * @Title: getMapRoute 
	 * @Description: 获取地图路线,客户端需要根据当前路线显示在地图上
	 * @param origin 起始坐标
	 * @param destination 终点坐标
	 * @return JSONObject 获取到的路线JSON对象
	 * @author CHEHAUNBO
	 * @since 1.8
	 * 
	 */
	public static JSONObject getMapRoute(String origin, String destination) {

		// 创建发送参数
		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		// access_key
		nameValuePairs.add(new BasicNameValuePair("key", AmapConfig.ACCESS_KEY));
		// 起点
		nameValuePairs.add(new BasicNameValuePair("origin", origin));
		// 终点
		nameValuePairs.add(new BasicNameValuePair("destination", destination));
		//驾车选择策略   0.速度优先（时间）1.费用优先（不走收费路段的最快道路）  2.距离优先 3.不走快速路 4.躲避拥堵 5.多策略（同时使用速度优先、费用优先、距离优先三个策略计算路径） 6.不走高速  7.不走高速且避免收费  8.躲避收费和拥堵  9.不走高速且躲避收费和拥堵 
		nameValuePairs.add(new BasicNameValuePair("strategy", AmapConfig.STRATEGY));
		
		JSONObject jsonObject = AmapHttpClientUtil.excuteHttpClient(nameValuePairs);

		return jsonObject;

	}

	/**
	 * 
	 * @Title: excuteHttpClient 
	 * @Description: 执行Http请求
	 * @param nameValuePairs 请求参数封装集合
	 * @return  JSONObject 相应内容
	 * @author CHEHAUNBO
	 * @since 1.8
	 * 
	 */
	private static JSONObject excuteHttpClient(List<NameValuePair> nameValuePairs) {

		// 相应对象
		HttpResponse httpResponse = null;
		// 相应JSON对象
		JSONObject jsonObject = null;
		try {

			// URL编码
			UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(nameValuePairs);
			urlEncodedFormEntity.setContentType("application/json");
			urlEncodedFormEntity.setContentEncoding("UTF-8");
			AmapHttpClientUtil.httpPost.setEntity(urlEncodedFormEntity);
			// 执行Http请求
			httpResponse = AmapHttpClientUtil.httpClient.execute(httpPost);
			// 将相应内容转换成String字符串
			String resContent = EntityUtils.toString(httpResponse.getEntity());
			jsonObject = JSONUtil.parseObject(resContent);

		} catch (UnsupportedEncodingException e) {
			log.error("URL编码出现异常！", e);
		} catch (IOException e) {
			log.error("执行HTTP请求出现异常！", e);
		}

		return jsonObject;

	}
	
	/**
	 * @Title: getSingleDistance
	 * @Description: 根据两点的经纬度获取下单距离（下单获取距离）
	 * @param origin 起始坐标
	 * @param destination 终点坐标
	 * @author yuHaiQing
	 * @return int    返回类型
	 * @throws
	 */
	public static JSONObject getSingleDistance(String origin, String destination){
		
    	//对请求参数进行封装
    	List<NameValuePair> params = new ArrayList<NameValuePair>();
    	
    	//出发点，经度在前，纬度在后，经度和纬度用","分割，经纬度小数点后不得超过6位。
    	params.add(new BasicNameValuePair("origin", origin));
    	//目的地，经度在前，纬度在后，经度和纬度用","分割，经纬度小数点后不得超过6位。
    	params.add(new BasicNameValuePair("destination", destination));
    	//返回结果详略: base:返回基本信息；all：返回全部信息
    	params.add(new BasicNameValuePair("extensions", "all"));
    	//返回数据格式类型(json、xml)
    	params.add(new BasicNameValuePair("output", "json"));
    	//驾车选择策略   0.速度优先（时间）1.费用优先（不走收费路段的最快道路）  2.距离优先 3.不走快速路 4.躲避拥堵 5.多策略（同时使用速度优先、费用优先、距离优先三个策略计算路径） 6.不走高速  7.不走高速且避免收费  8.躲避收费和拥堵  9.不走高速且躲避收费和拥堵 
    	params.add(new BasicNameValuePair("strategy", "2"));
    	//用户唯一标识
    	params.add(new BasicNameValuePair("key", AmapConfig.ACCESS_KEY));
        
    	JSONObject jsonObject = AmapHttpClientUtil.excuteHttpClient(params);
		
    	return jsonObject;
	}

}
